using voidbox;
using System;
using System.Numerics;
using TTEngine.Graphics;
using TTEngine.TTMath;

namespace TTEngine.Graphics
{
    // TODO: 需要以下类型:
    // - RenderBatcher
    // - DrawPoint
    // - Color

    public class PackedTextureSprite
    {

        public readonly PackedTextureGroup Group;
        public readonly PackedTextureElement Info;

        public PackedTextureSprite(PackedTextureGroup _group, PackedTextureElement _info)
        {
            Group = _group;
            this.Info = _info;
        }

        // public void RenderRectWithLimit(RenderBatcher batcher, Rectangle rect, Rectangle limitRect, Color? color = null, int palIndex = -1)
        // {
        //     if (_colorBuf == null)
        //         _colorBuf = Color.White;

        //     var _color = color ?? _colorBuf;

        //     float sx = rect.Width / PixelWidth;
        //     float sy = rect.Height / PixelHeight;

        //     float x1 = rect.X;
        //     float x2 = rect.X + rect.Width;
        //     float y1 = rect.Y;
        //     float y2 = rect.Y + rect.Height;

        //     float u1 = UV.U1;
        //     float v1 = UV.V1;
        //     float u2 = UV.U2;
        //     float v2 = UV.V2;

        //     float wx = x2 - x1;
        //     float wy = y2 - y1;

        //     // 检查是否整体抹去
        //     if (x1 >= limitRect.X + limitRect.Width || x2 < limitRect.X ||
        //         y1 >= limitRect.Y + limitRect.Height || y2 < limitRect.Y)
        //     {
        //         x1 = x2 = y1 = y2 = 0;
        //     }
        //     else if (wx != 0 && wy != 0)
        //     {
        //         float nx1 = x1;
        //         float nx2 = x2;
        //         float ny1 = y1;
        //         float ny2 = y2;
        //         bool change = false;

        //         if (x1 < limitRect.X)
        //         {
        //             nx1 = limitRect.X;
        //             change = true;
        //         }
        //         if (x2 > limitRect.X + limitRect.Width)
        //         {
        //             nx2 = limitRect.X + limitRect.Width;
        //             change = true;
        //         }
        //         if (y1 < limitRect.Y)
        //         {
        //             ny1 = limitRect.Y;
        //             change = true;
        //         }
        //         if (y2 > limitRect.Y + limitRect.Height)
        //         {
        //             ny2 = limitRect.Y + limitRect.Height;
        //             change = true;
        //         }

        //         if (change)
        //         {
        //             float uw = u2 - u1;
        //             float vw = v2 - v1;
        //             float sx1 = (nx1 - x1) / wx;
        //             float sx2 = (nx2 - x2) / wx;
        //             float sy1 = (ny1 - y1) / wy;
        //             float sy2 = (ny2 - y2) / wy;

        //             u1 = u1 + uw * sx1;
        //             v1 = v1 + vw * sy1;
        //             u2 = u2 + uw * sx2;
        //             v2 = v2 + vw * sy2;
        //             x1 = nx1;
        //             y1 = ny1;
        //             x2 = nx2;
        //             y2 = ny2;
        //         }
        //     }

        //     SetupRectPoints(x1, y1, x2, y2, u1, v1, u2, v2, _color);
        //     batcher.DrawQuads(Material, _rectBuf, 1);
        // }

        // public void RenderRect(RenderBatcher batcher, Rectangle rect, Color? color = null, int palIndex = -1)
        // {
        //     if (_colorBuf == null)
        //         _colorBuf = Color.White;

        //     var _color = color ?? _colorBuf;

        //     float sx = rect.Width / PixelWidth;
        //     float sy = rect.Height / PixelHeight;

        //     SetupRectPoints(
        //         rect.X, rect.Y,
        //         rect.X + rect.Width, rect.Y + rect.Height,
        //         UV.U1, UV.V1, UV.U2, UV.V2,
        //         _color
        //     );

        //     batcher.DrawQuads(Material, _rectBuf, 1);
        // }

        // public void RenderWithPivot(RenderBatcher batcher, Vector2 pos, Vector2 scale, Color? color = null, int palIndex = -1)
        // {
        //     if (_colorBuf == null)
        //         _colorBuf = Color.White;

        //     var _color = color ?? _colorBuf;

        //     float x1 = pos.X - scale.X * PivotX;
        //     float x2 = x1 + scale.X * PixelWidth;
        //     float y1 = pos.Y - scale.Y * PivotY;
        //     float y2 = y1 + scale.Y * PixelHeight;

        //     SetupRectPoints(x1, y1, x2, y2, UV.U1, UV.V1, UV.U2, UV.V2, _color);
        //     batcher.DrawQuads(Material, _rectBuf, 1);
        // }

        // public void RenderWithPivotAndRotate(RenderBatcher batcher, Vector2 pos, Vector2 scale, float rotate, Color? color = null, int palIndex = -1)
        // {
        //     if (_colorBuf == null)
        //         _colorBuf = Color.White;

        //     var _color = color ?? _colorBuf;

        //     float x1 = pos.X;
        //     float x2 = pos.X + scale.X * PixelWidth;
        //     float y1 = pos.Y;
        //     float y2 = pos.Y + scale.Y * PixelHeight;

        //     // 旋转逻辑
        //     float cx = pos.X + PivotX * scale.X;
        //     float cy = pos.Y + PivotY * scale.Y; // 中心点
        //     float dx1 = x1 - cx; // 偏移
        //     float dy1 = y1 - cy;
        //     float dx2 = x2 - cx;
        //     float dy2 = y2 - cy;

        //     // 矩阵变换
        //     float sinr = MathF.Sin(rotate);
        //     float cosr = MathF.Cos(rotate);

        //     float p0x = x1 + dx1 * cosr - dy1 * sinr;
        //     float p0y = y1 + dx1 * sinr + dy1 * cosr;
        //     float p1x = x1 + dx2 * cosr - dy1 * sinr;
        //     float p1y = y1 + dx2 * sinr + dy1 * cosr;
        //     float p2x = x1 + dx1 * cosr - dy2 * sinr;
        //     float p2y = y1 + dx1 * sinr + dy2 * cosr;
        //     float p3x = x1 + dx2 * cosr - dy2 * sinr;
        //     float p3y = y1 + dx2 * sinr + dy2 * cosr;

        //     SetupRectPoints(
        //         p0x, p0y, p3x, p3y,
        //         UV.U1, UV.V1, UV.U2, UV.V2,
        //         _color
        //     );

        //     batcher.DrawQuads(Material, _rectBuf, 1);
        // }

        // private void SetupRectPoints(float x1, float y1, float x2, float y2, float u1, float v1, float u2, float v2, Color color)
        // {
        //     // 确保缓冲区足够大
        //     while (_rectBuf.Length < 4)
        //     {
        //         Array.Resize(ref _rectBuf, _rectBuf.Length + 1);
        //         _rectBuf[_rectBuf.Length - 1] = new DrawPoint();
        //     }

        //     // 设置四个顶点
        //     _rectBuf[0].Set(x1, y1, u1, v1, color, UVLayer, Effect);
        //     _rectBuf[1].Set(x2, y1, u2, v1, color, UVLayer, Effect);
        //     _rectBuf[2].Set(x1, y2, u1, v2, color, UVLayer, Effect);
        //     _rectBuf[3].Set(x2, y2, u2, v2, color, UVLayer, Effect);
        // }
    }

    public class PackedTextureSpriteScale9
    {

        public readonly PackedTextureGroup Group;
        public readonly PackedTextureElement Info;
        public readonly Border Border;
        public PackedTextureSpriteScale9(PackedTextureGroup _group, PackedTextureElement _info,Border _border)
        {
            Border = _border;
            Group = _group;
            this.Info = _info;
        }

    }

}